home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / HTML / MenuBrowser.php < prev    next >
PHP Script  |  2004-03-24  |  8KB  |  275 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2003 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Author: Ulf Wendel <ulf.wendel@phpdoc.de>                            |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: MenuBrowser.php,v 1.4 2003/09/15 17:24:38 avb Exp $
  20.  
  21. /**
  22. * Simple filesystem browser that can be used to generated menu (3) hashes based on the directory structure.
  23. *
  24. * Together with menu (3) and the (userland) cache you can use this
  25. * browser to generate simple fusebox like applications / content systems.
  26. *
  27. * Let the menubrowser scan your document root and generate a menu (3) structure
  28. * hash which maps the directory structure, pass it to menu's setMethod() and optionally
  29. * wrap the cache around all this to save script runs. If you do so, it looks
  30. * like this:
  31. *
  32. * // document root directory
  33. * define('DOC_ROOT', '/home/server/www.example.com/');
  34. *
  35. * // instantiate the menubrowser
  36. * $browser = new menubrowser(DOC_ROOT);
  37. *
  38. * // instantiate menu (3)
  39. * $menu = new menu($browser->getMenu());
  40. *
  41. * // output the sitemap
  42. * $menu->show('sitemap');
  43. *
  44. * Now, use e.g. simple XML files to store your content and additional menu informations
  45. * (title!). Subclass exploreFile() depending on your file format.
  46. *
  47. * @author   Ulf Wendel <ulf.wendel@phpdoc.de>
  48. * @version  $Revision: 1.4 $
  49. * @package  HTML_Menu
  50. */
  51. class HTML_MenuBrowser 
  52. {
  53.    /**
  54.     * Filesuffix of your XML files.
  55.     *
  56.     * @var  string
  57.     * @see  HTML_MenuBrowser()
  58.     */
  59.     var $file_suffix = 'xml';
  60.  
  61.    /**
  62.     * Number of characters of the file suffix.
  63.     *
  64.     * @var  int
  65.     * @see  HTML_MenuBrowser()
  66.     */
  67.     var $file_suffix_length = 3;
  68.  
  69.    /**
  70.     * Filename (without suffix) of your index / start pages.
  71.     *
  72.     * @var  string
  73.     * @see  HTML_MenuBrowser()
  74.     */
  75.     var $index = 'index';
  76.  
  77.    /**
  78.     * Full filename of your index / start pages.
  79.     *
  80.     * @var  string
  81.     * @see  $file_suffix, $index
  82.     */
  83.     var $index_file = '';
  84.  
  85.    /**
  86.     * Directory to scan.
  87.     *
  88.     * @var  string
  89.     * @see  setDirectory()
  90.     */
  91.     var $dir = '';
  92.  
  93.    /**
  94.     * Prefix for every menu hash entry.
  95.     *
  96.     * Set the ID prefix if you want to merge the browser menu
  97.     * hash with another (static) menu hash so that there're no
  98.     * name clashes with the ids.
  99.     *
  100.     * @var  string
  101.     * @see  setIDPrefix()
  102.     */
  103.     var $id_prefix = '';
  104.  
  105.     /**
  106.     * Menu (3)'s setMenu() hash.
  107.     *
  108.     * @var  array
  109.     */
  110.     var $menu = array();
  111.  
  112.    /**
  113.     * Creates the object and optionally sets the directory to scan.
  114.     *
  115.     * @param    string  Directory to scan
  116.     * @param    string  Filename of index pages
  117.     * @param    string  Suffix for files containing the additional data
  118.     * @see      $dir
  119.     */
  120.     function HTML_MenuBrowser($dir = '', $index = '', $file_suffix = '')
  121.     {
  122.         if ($dir) {
  123.             $this->dir = $dir;
  124.         }
  125.         if ($index) {
  126.             $this->index = $index;
  127.         }
  128.         if ($file_suffix) {
  129.             $this->file_suffix = $file_suffix;
  130.         }
  131.  
  132.         $this->index_file = $this->index . '.' . $this->file_suffix;
  133.         $this->file_suffix_length = strlen($this->file_suffix);
  134.     }
  135.  
  136.  
  137.    /**
  138.     * Sets the directory to scan.
  139.     *
  140.     * @param    string  directory to scan
  141.     * @access   public
  142.     */
  143.     function setDirectory($dir) 
  144.     {
  145.         $this->dir = $dir;
  146.     }
  147.  
  148.  
  149.    /**
  150.     * Sets the prefix for every id in the menu hash.
  151.     *
  152.     * @param    string
  153.     * @access   public
  154.     */
  155.     function setIDPrefix($prefix) 
  156.     {
  157.         $this->id_prefix = $prefix;
  158.     }
  159.  
  160.  
  161.    /**
  162.     * Returns a hash to be used with menu(3)'s setMenu().
  163.     *
  164.     * @param    string  directory to scan
  165.     * @param    string  id prefix
  166.     * @access   public
  167.     */
  168.     function getMenu($dir = '', $prefix = '') 
  169.     {
  170.         if ($dir) {
  171.             $this->setDirectory($dir);
  172.         }
  173.         if ($prefix) {
  174.             $this->setIDPrefix($prefix);
  175.         }
  176.  
  177.         // drop the result of previous runs
  178.         $this->files = array();
  179.  
  180.         $this->menu = $this->browse($this->dir);
  181.         $this->menu = $this->addFileInfo($this->menu);
  182.  
  183.         return $this->menu;
  184.     }
  185.  
  186.  
  187.    /**
  188.     * Recursive function that does the scan and builds the menu (3) hash.
  189.     *
  190.     * @param    string  directory to scan
  191.     * @param    integer entry id - used only for recursion
  192.     * @param    boolean ??? - used only for recursion
  193.     * @return   array
  194.     */
  195.     function browse($dir, $id = 0, $noindex = false)
  196.     {
  197.         $struct = array();
  198.         $dh = opendir($dir);
  199.         while ($file = readdir($dh)) {
  200.             if ('.' == $file || '..' == $file) {
  201.                 continue;
  202.             }
  203.             $ffile = $dir . $file;
  204.             if (is_dir($ffile)) {
  205.                 $ffile .= '/';
  206.                 if (file_exists($ffile . $this->index_file)) {
  207.                     $id++;
  208.                     $struct[$this->id_prefix . $id]['url'] = $ffile . $this->index_file;
  209.  
  210.                     $sub = $this->browse($ffile, $id + 1, true);
  211.                     if (0 != count($sub)) {
  212.                         $struct[$this->id_prefix . $id]['sub'] = $sub;
  213.                     }
  214.                 }
  215.             } else {
  216.                 if ($this->file_suffix == substr($file, strlen($file) - $this->file_suffix_length, $this->file_suffix_length)
  217.                     && !($noindex && $this->index_file == $file) )
  218.                 {
  219.                     $id++;
  220.                     $struct[$this->id_prefix . $id]['url'] = $dir . $file;
  221.                 }
  222.             }
  223.         }
  224.         return $struct;
  225.     }
  226.  
  227.  
  228.    /**
  229.     * Adds further informations to the menu hash gathered from the files in it
  230.     *
  231.     * @param    array   Menu hash to examine
  232.     * @return   array   Modified menu hash with the new informations
  233.     */
  234.     function addFileInfo($menu) 
  235.     {
  236.         // no foreach - it works on a copy - the recursive
  237.         // structure requires already lots of memory
  238.         reset($menu);
  239.         while (list($id, $data) = each($menu)) {
  240.             $menu[$id] = array_merge($data, $this->exploreFile($data['url']));
  241.             if (isset($data['sub'])) {
  242.                 $menu[$id]['sub'] = $this->addFileInfo($data['sub']);
  243.             }
  244.         }
  245.  
  246.         return $menu;
  247.     }
  248.  
  249.  
  250.    /**
  251.     * Returns additional menu informations decoded in the file that appears in the menu.
  252.     *
  253.     * You should subclass this method to make it work with your own
  254.     * file formats. I used a simple XML format to store the content.
  255.     *
  256.     * @param    string  filename
  257.     */
  258.     function exploreFile($file) 
  259.     {
  260.         $xml = join('', @file($file));
  261.         if (!$xml) {
  262.             return array();
  263.         }
  264.  
  265.         $doc = xmldoc($xml);
  266.         $xpc = xpath_new_context($doc);
  267.  
  268.         $menu = xpath_eval($xpc, '//menu');
  269.         $node = &$menu->nodeset[0];
  270.  
  271.         return array('title' => $node->content);
  272.     }
  273. }
  274. ?>
  275.